import random
import secrets
from datetime import datetime

from celery import shared_task
from django.utils import timezone

from .models import Host, HostStatistic, City


@shared_task
def rotate_host_passwords():
    """
    为所有主机生成随机密码并在主机上实际修改
    1. 生成随机密码
    2. 通过SSH连接到主机修改实际密码
    3. 在数据库中存储新密码
    """
    # 随机生成密码
    def generate_secure_password():
        password = random.randint(100000, 999999)
        print(password)
        return password
    # 获取所有主机
    hosts = Host.objects.all()
    # 记录操作日志
    log_messages = []
    updated_count = 0

    for host in hosts:
        try:
            # 获取当前密码（用于SSH连接）
            current_password = host.root_password
            # 生成新密码
            new_password = generate_secure_password()

            # 连接到主机并修改密码
            pass

            # 如果修改成功，更新数据库
            a = True
            if a:
                # 修改成功，更新数据库
                host.root_password = new_password
                host.password_updated_at = timezone.now()
                host.save()

                # 记录成功日志
                message = f"[SUCCESS] 更新成功： {host.hostname}({host.ip})"
                updated_count += 1
            else:
                message = f"[ERROR] 更新失败： {host.hostname}"
        except Exception as e:
            message = f"[ERROR] 更新失败： {host.hostname} "
        log_messages.append(message)
    # 添加总结信息
    log_messages.append(f"密码更新完成。 {updated_count}/{len(hosts)} 已更新。")
    # 将日志写入文件或发送通知
    with open('password_rotation.log', 'a') as log_file:
        log_file.write("\n" + datetime.now().isoformat() + "\n")
        log_file.write("\n".join(log_messages))
        log_file.write("\n" + "-" * 50 + "\n")

    return


@shared_task
def generate_daily_statistics():
    """
    每天00:00统计每个城市和机房的主机数量
    """
    # 获取今天的日期
    today = timezone.now().date()

    # 检查是否已经生成了今天的统计
    if HostStatistic.objects.filter(date=today).exists():
        return "今天的统计数据已存在，跳过统计"

    # 记录统计结果
    stats_created = 0

    # 遍历所有城市
    for city in City.objects.all():
        # 遍历该城市的所有机房
        for idc in city.idcs.all():
            # 统计该机房的主机数量
            count = idc.hosts.count()

            # 创建统计记录
            HostStatistic.objects.create(
                date=today,
                city=city,
                idc=idc,
                host_count=count
            )
            stats_created += 1

    return f"成功创建了 {stats_created} 条统计记录，日期: {today}"